package com.yy.job.core.run.flow;

import com.yy.job.core.domain.context.ProcessContext;

public abstract class AbsJobRunFlow<T extends ProcessContext> {

	public void flow(T t) {
		// 准备动作
		this.prepare(t);
		// 填充和校验数据
		this.check(t);
		// 执行
		this.run(t);
		// 执行完毕之后的动作
		this.after(t);
	}

	/**
	 * 幂等，返回值为true表示给job或者step已成功，不需要再执行
	 * 
	 * @param t
	 */
	protected abstract boolean idempotent(T t);

	/**
	 * 准备动作
	 * 
	 * @param t
	 */
	protected abstract void prepare(T t);

	/**
	 * 校验
	 * 
	 * @param t
	 */
	protected abstract void check(T t);

	/**
	 * 执行
	 * 
	 * @param t
	 */
	protected abstract void run(T t);

	/**
	 * 执行之后的后续动作
	 * 
	 * @param t
	 */
	protected abstract void after(T t);

	/**
	 * 异常处理
	 * 
	 * @param t
	 */
	protected abstract void exception(T t, Exception e);

	/**
	 * 结束
	 * 
	 * @param t
	 */
	protected abstract void end(T t);

}
